package com.yunji.framework_template.common.util;

import java.io.IOException;
import java.io.InputStream;
import java.io.UnsupportedEncodingException;
import java.net.URL;
import java.net.URLEncoder;

import com.yunji.framework_template.common.constant.Constant;

/**
 * @author Fenglb E-mail:fenglb@sunline.cn
 * @version 1.0 创建时间：2009-11-11 下午02:26:26 类说明:根据Url地址获取指定网页文件的内容，可以是本地的网页，也可以是互联网上的网页。
 */
public class UrlUtil {

    public static String getContentByURL(String urlStr) throws IOException {
        return getContentByURL(urlStr, null);
    }

    /**
     * 根据URL读取内容，可以网络上的网页也可以是本地的网页. 如果是本地网页，需要在前面补充为Url标准访问地址，即在本地文件绝对路径前面补"file:///"，
     * 如本地文件为"c:/a.htm"，则通过补充为"file:///c:/a.htm"
     * 
     * @param urlStr 待读取的url
     * @param charset 编码格式
     * @return 获取到的内容
     * @throws IOException
     */
    public static String getContentByURL(String urlStr, String charset) throws IOException {
        String content = "";
        URL url = new URL(urlStr);
        InputStream ins = url.openStream();
        byte[] bt = new byte[2048];
        int len = 0;
        while ((len = ins.read(bt)) != -1) {
            byte[] tbt = new byte[len];
            System.arraycopy(bt, 0, tbt, 0, len);
            content += new String(tbt);
            bt = new byte[2048];
        }
        if (charset == null) {
            charset = getCharset(content);
        }
        content = new String(content.getBytes(), charset);
        ins.close();
        // content = content.toLowerCase();
        return content;
    }

    /**
     * 获取当前网页内容的编码，未指定则为GBK
     * 
     * @param content
     * @return
     */
    private static String getCharset(String content) {
        String charset = "";
        int start = content.indexOf("charset=");
        if (start > 0) {
            content = content.substring(start + 8);
            int end = content.indexOf("\"");
            charset = content.substring(0, end);
            if (!(charset.startsWith("utf") || charset.equalsIgnoreCase("gbk") || charset.equalsIgnoreCase("gb2312"))) {
                charset = "gbk";
            }
        } else {
            charset = "gbk";
        }
        return charset;
    }

    /**
     * 根据当前页的url地址，以及传入的图片地址(主要三种类型，一种是以http开始的绝对地址；一种是以"/"开头的地址；另外一种直接是文件名，如"aa.gif")，拼装该图片的url地址
     * 
     * @param url 当前页面的url地址
     * @param fileUrl 当前图片的地址
     * @return
     */
    public static String makeUrl(String url, String fileUrl) {
        String hostUrl = getHost(url);
        if (fileUrl.indexOf("://") > 0) {// 绝对地址
            return fileUrl;
        }
        if (fileUrl.startsWith("/")) {
            if (hostUrl.endsWith("/")) {
                hostUrl = hostUrl.substring(0, hostUrl.length() - 2);
            }
            fileUrl = hostUrl + fileUrl;
        } else {
            if (!hostUrl.endsWith("/")) {
                hostUrl = hostUrl + "/";
            }
            fileUrl = hostUrl + fileUrl;
        }
        return fileUrl;
    }

    /**
     * 根据传入的url地址，获取主域地址，如传入"http://www.163.com/a/b.html"，得到的值为"http://www.163.com"
     * 
     * @param url
     * @return
     */
    public static String getHost(String url) {
        String host = null;
        String urlTemp = url.replace("://", "");
        if (urlTemp.indexOf("/") > 0) {
            host = url.substring(0, urlTemp.indexOf("/") + 3);
        } else {
            host = url;
        }
        return host;
    }

    /**
     * 移除协议头
     * 
     * @param url
     * @return
     */
    public static String removeProtocol(String url) {
        if (StringUtil.isEmpty(url)) {
            return url;
        }
        if (url.indexOf("://") < 0) {
            return url;
        }
        int index = url.indexOf("://") + 3;
        url = url.substring(index);
        return url;
    }

    /**
     * 处理URL中的特殊字符，如将空格替换为%20等、将中文进行转码等操作:<br>
     * 1. + URL 中+号表示空格 %2B <br>
     * 2. 空格 URL中的空格可以用+号或者编码 %20<br>
     * 3. / 分隔目录和子目录 %2F<br>
     * 4. ? 分隔实际的 URL 和参数 %3F<br>
     * 5. % 指定特殊字符 %25<br>
     * 6. # 表示书签 %23<br>
     * 7. & URL 中指定的参数间的分隔符 %26<br>
     * 8. = URL 中指定参数的值 %3D <br>
     * 
     * @param url
     * @return
     * @throws UnsupportedEncodingException
     */
    public static String prettyUrl(String url) throws UnsupportedEncodingException {
        if (StringUtil.isEmpty(url)) {
            return url;
        }
        if (!(url.startsWith(Constant.HTTP_PROTOCOL) || url.startsWith(Constant.HTTPS_PROTOCOL))) {
            url = new StringBuilder(Constant.HTTP_PROTOCOL).append(url).toString();
        }
        // 处理空格
        url = url.replace(" ", "%20");
        // 处理中文
        StringBuffer utf8Str = new StringBuffer();
        char[] charArray = url.toCharArray();
        for (int i = 0; i < charArray.length; i++) {
            if ((charArray[i] >= 0x4e00) && (charArray[i] <= 0x9fbb)) {
                utf8Str.append(URLEncoder.encode(String.valueOf(charArray[i]), "utf-8"));
            } else {
                utf8Str.append(charArray[i]);
            }
        }
        return utf8Str.toString();
    }
}
